#include<stdio.h>
#include<pthread.h>
#include<unistd.h>

#define NUM 1000 
int tickets = NUM; // 临界资源 
pthread_mutex_t mutex;

void *ticket_get(void *arg)
{
  const char* name = (char*)arg;  
  while(1)
  {
    pthread_mutex_lock(&mutex);
    if(tickets > 0){
      usleep(1000);
      printf("[%s] num ticket: %d\n", name, tickets--);//tickets--是临界区，不是原子的
      pthread_mutex_unlock(&mutex);
    }
    else
    {
      pthread_mutex_unlock(&mutex);
      break;
    }
  }

  printf("%s quit!\n", name);
  pthread_exit((void*)0);
}

int main()
{

  pthread_t t1, t2, t3, t4;
  pthread_mutex_init(&mutex, NULL);
  pthread_create(&t1, NULL, ticket_get, (void*)"thread 1");
  pthread_create(&t2, NULL, ticket_get, (void*)"thread 2");
  pthread_create(&t3, NULL, ticket_get, (void*)"thread 3");
  pthread_create(&t4, NULL, ticket_get, (void*)"thread 4");

  pthread_join(t1,NULL);
  pthread_join(t2,NULL);
  pthread_join(t3,NULL);
  pthread_join(t4,NULL);

  pthread_mutex_destroy(&mutex);
  //while(1){
  //  printf("I am main thread!,pid: %d \n",getppid());
  //  sleep(2);
  //}
  return 0;
}
